<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <script>
      /*
    * 
    * 2. 两数相加
给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。

请你将两个数相加，并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外，这两个数都不会以 0 开头。

 

示例 1：


输入：l1 = [2,4,3], l2 = [5,6,4]
输出：[7,0,8]
解释：342 + 465 = 807.
*
*
* */
      // 2 4 3
      // 9 8 8

      function ListNode(val) {
        this.val = val;
        this.next = null;
      }
      const l1 = { val: 2, next: { val: 4, next: { val: 3, next: null } } },
        l2 = { val: 9, next: { val: 8, next: { val: 8, next: null } } };

      var addTwoNumbers = function (l1, l2) {
        let head = null,
          tail = null;
        let carry = 0;
        while (l1 || l2) {
          const n1 = l1 ? l1.val : 0;
          const n2 = l2 ? l2.val : 0;
          const sum = n1 + n2 + carry;
          if (!head) {
            head = tail = new ListNode(sum % 10);
          } else {
            tail.next = new ListNode(sum % 10);
            tail = tail.next;
          }
          carry = Math.floor(sum / 10); //1
          if (l1) {
            l1 = l1.next;
          }
          if (l2) {
            l2 = l2.next;
          }
        }

        if (carry > 0) {
          tail.next = new ListNode(carry);
        }
        return head;
      };
      console.log(addTwoNumbers(l1, l2));

      /**
       * Definition for singly-linked list.
       * function ListNode(val) {
       *     this.val = val;
       *     this.next = null;
       * }
       */
      /**
       * @param {ListNode} l1
       * @param {ListNode} l2
       * @return {ListNode}
       */
      var addTwoNumbers1 = function (l1, l2) {
        if (l1 === null || l2 === null) return null;

        // 使用dummyHead可以简化对链表的处理，dummyHead.next指向新链表
        let dummyHead = new ListNode(0);
        let cur1 = l1;
        let cur2 = l2;
        let cur = dummyHead; // cur用于计算新链表
        let carry = 0; // 进位标志

        while (cur1 !== null || cur2 !== null) {
          let val1 = cur1 !== null ? cur1.val : 0;
          let val2 = cur2 !== null ? cur2.val : 0;
          let sum = val1 + val2 + carry;
          let newNode = new ListNode(sum % 10); // sum%10取模结果范围为0~9，即为当前节点的值
          carry = sum >= 10 ? 1 : 0; // sum>=10，carry=1，表示有进位
          cur.next = newNode;
          cur = cur.next;

          if (cur1 !== null) {
            cur1 = cur1.next;
          }

          if (cur2 !== null) {
            cur2 = cur2.next;
          }
        }

        if (carry > 0) {
          // 如果最后还有进位，新加一个节点
          cur.next = new ListNode(carry);
        }

        return dummyHead.next;
      };
    </script>
  </body>
</html>
